<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en-us">
<head>
  <title>
    在Intellij IDEA中引用Golang本地包 // 飞狐的部落格
  </title>

  <link href="http://gmpg.org/xfn/11" rel="profile">
<meta http-equiv="content-type" content="text/html; charset=utf-8">


<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">

<meta name="description" content="Blog of Rosen Lu">
<meta name="keywords" content="Go,Intellij IDEA,">
<meta name="author" content="飞狐">
<meta name="generator" content="Hugo 0.14" />

  <meta property="og:title" content="在Intellij IDEA中引用Golang本地包" />
<meta property="og:description" content="Blog of Rosen Lu" />
<meta property="og:type" content="website" />
<meta property="og:locale" content="en_US" />
<meta property="og:url" content="http://lucumt.info/posts/import-local-package-in-intellij-idea/" />


  
   <link rel="stylesheet" href="http://lucumt.info/css/base-min.css">
   <link rel="stylesheet" href="http://lucumt.info/css/pure-min.css">
  
  
    <link rel="stylesheet" href="http://lucumt.info/css/grids-responsive-min.css">
  
  

  <link rel="stylesheet" href="http://lucumt.info/css/redlounge.css">
  
  <link rel="stylesheet" href="http://lucumt.info/css/googleapis.font.css">
  <link rel="stylesheet" href="http://lucumt.info/css/jqcloud.css">
  <link href="//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet">
  

  
  <link rel="apple-touch-icon-precomposed" sizes="144x144" href="http://lucumt.info/touch-icon-144-precomposed.png">
  <link rel="shortcut icon" href="http://lucumt.info/lucumt.ico">

  
  <link href="" rel="alternate" type="application/rss+xml" title="飞狐的部落格" />

  <script src="http://lucumt.info//js/jquery.min.js"></script>
  <script src="http://lucumt.info//js/jqcloud-1.0.4.min.js"></script>

    
  
  <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.6.0/styles/rainbow.min.css">
  
  <script src="http://lucumt.info/js/highlight.min.js"></script>
  <script>hljs.initHighlightingOnLoad();</script>


  

  

  

<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', "UA-75123653-1", 'auto');
  ga('send', 'pageview');
</script>




<script>
var _hmt = _hmt || [];
(function() {
  var hm = document.createElement("script");
  hm.src = "https://hm.baidu.com/hm.js?cabc0a71f63da092412d82d1aefe7d1c";
  var s = document.getElementsByTagName("script")[0]; 
  s.parentNode.insertBefore(hm, s);
})();
</script>

</head>
<body>
	
		<div id="nav-to-top">
			<span class="decorative-marker">//</span><a href="#top">返回顶部</a>
		</div>
	

	<div id="layout" class="pure-g">
    
		 <a href="https://github.com/lucumt/ghblog" target="_new">
			<img style="position: absolute; top: 0; right: 0; border: 0;" 
			src="/img/forkme_right_red.png" alt="Fork me on GitHub">
		</a>

    <div class="sidebar pure-u-1 pure-u-md-1-4">
  <div class="header">
    

	
	  <img src="http://lucumt.info/img/photo.jpg" class="profilepic">
	

    <h1 class="brand-title">飞狐的部落格</h1>
    <h2 class="brand-tagline">Rosen Lu</h2>

    <nav class="nav">
      <ul class="nav-list">
        <li class="nav-item"><span class="nav-item-separator">//</span><a href="http://lucumt.info/">Home</a></li>
        
          <li class="nav-item"><span class="nav-item-separator">//</span><a href="http://lucumt.info/about/">About</a></li>
        
          <li class="nav-item"><span class="nav-item-separator">//</span><a href="http://lucumt.info/posts/">Blog</a></li>
        
      </ul>
    </nav>

    
    <div class="social-buttons">
      
        
        <a href="https://github.com/lucumt" target="_blank"><i class='fa fa-github'></i></a>
        
      
        
        <a href="https://plus.google.com/u/0/115794588502118898127/posts" target="_blank"><i class='fa fa-google-plus'></i></a>
        
      
        
        <a href="https://www.facebook.com/rosen.lu.1" target="_blank"><i class='fa fa-facebook'></i></a>
        
      
        
        <a href="http://www.twitter.com/rosenlucumt" target="_blank"><i class='fa fa-twitter'></i></a>
        
      
        
        <a href="mailto:lucumt@gmail.com" target="_blank"><i class='fa fa-mail-forward'></i></a>
        
      
    </div>
    
    
	
	  <hr class="nav-site-separator"/>
	  <nav class="nav">
      <ul class="nav-list">
	    
		   <li class="nav-site"><a href="http://lilydjwg.is-programmer.com/" target="_blank">依云的博客</a></li>
		
		   <li class="nav-site"><a href="http://evilbinary.org/" target="_blank">邪恶二进制</a></li>
		
		   <li class="nav-site"><a href="http://www.wlman.cc/" target="_blank">Consec &#39;s Blog</a></li>
		
		   <li class="nav-site"><a href="http://www.linuxzen.com/" target="_blank">cold&#39;s world</a></li>
		
		   <li class="nav-site"><a href="http://frantic1048.logdown.com/" target="_blank">Frantic log#1048</a></li>
		
	  </ul>
	  </nav>
	
	

  </div>
</div>

	
	

    <div class="content pure-u-1 pure-u-md-3-4">
		<a name="top"></a>
		

		
			
		    <div id="toc" class="pure-u-1 pure-u-md-1-4">
				<small class="toc-label">Contents</small>
		   	 	<nav id="TableOfContents">
<ul>
<li>
<ul>
<li><a href="#在eclipse中引用golang本地包:bb4f21717a930ee21245b90e8acfc2d5">在Eclipse中引用Golang本地包</a></li>
<li><a href="#在intellij-idea中引用golang本地包:bb4f21717a930ee21245b90e8acfc2d5">在Intellij IDEA中引用Golang本地包</a></li>
<li><a href="#利用goclipse时无法运行程序的解决方法:bb4f21717a930ee21245b90e8acfc2d5">利用Goclipse时无法运行程序的解决方法</a></li>
</ul></li>
</ul>
</nav>
		    </div>
		    
	    
  		<section class="post">
            <h1 class="post-title">
              <a href="http://lucumt.info/posts/import-local-package-in-intellij-idea">在Intellij IDEA中引用Golang本地包</a>
            </h1>
            <h3 class="post-subtitle">
            	
            </h3>
            
            	<span class="post-date">
                	<span class="post-date-day"><sup>5</sup></span><span class="post-date-separator">/</span><span class="post-date-month">Mar</span> <span class="post-date-year">2017</span>
            	</span>
            	
            
            	
            		<span class="post-author-single">By <a class="post-author" href="https://www.linkedin.com/in/%E8%BF%90%E5%BC%BA-%E5%8D%A2-50a08bb5/" target="_new">飞狐</a></span>
            		




            	
            

			
			
				<div class="post-categories">
				
					<a class="post-category post-category-go" href="http://lucumt.info//categories/go">Go</a>
				
					<a class="post-category post-category-intellij-idea" href="http://lucumt.info//categories/intellij-idea">Intellij IDEA</a>
				
				</div>
			

			

			

            

<p>在学习<code>Golang</code>时，自己最开始用的是eclpse中的<a href="https://goclipse.github.io/">goclipse</a>插件来进行<code>Golang</code>编程，但其对<code>Golang</code>的支持不是太好，如代码格式化、自动导入引用包等都无法直接在eclipse中使用，并且其自动提示功能也没有像<code>Java</code>那么强，于是转用<a href="https://www.jetbrains.com/idea/">Intellij IDEA</a>安装<a href="https://plugins.jetbrains.com/plugin/5047-go">Golang插件</a>来替代使用，安装完插件后的<a href="https://www.jetbrains.com/idea/">Intellij IDEA</a>对<code>Golang</code>的支持在各方面都很令人满意，唯独引入本地包的支持不太好用。经过一阵摸索自己找出了解决方案，先记录下。</p>

<h2 id="在eclipse中引用golang本地包:bb4f21717a930ee21245b90e8acfc2d5">在Eclipse中引用Golang本地包</h2>

<p>若我们采用的是<a href="https://goclipse.github.io/">goclipse</a>来开发<code>Golang</code>,则在其中引用本地包很简单，和引用Java包类似。如下图所示，假设 <em>src</em> 是源代码所在的目录，在 <em>src</em> 的 <em>sec</em> 文件夹下有一个名为 <em>calculate.go</em> 的文件，其中有一个名为 <em>Add</em> 的函数用于计算两个整数的相加之和。<br />
<img src="http://lucumt.info/blog_img/import-local-page-in-intellij-idea/goclipse_package.png" alt="goclipse中的本地包" />
<br />
若要在主程序main方法中调用 <em>Add</em> 方法，先通过import引入该文件的包名<code>import service</code>，然后通过包名调用该方法<code>service.Add(1,2)</code>，如下图所示，可以看出在Eclipse中引用<code>Golang</code>本地包与引用Java包没有太大的区别，都是将包文件放到 <em>src</em> 源文件夹下，然后通过包名来引用。<br />
<img src="http://lucumt.info/blog_img/import-local-page-in-intellij-idea/goclipse_package_reference.png" alt="goclipse中的本地包引用" />
<br />
也可以通过直接导入该包所在的文件夹的名称来调用该方法，此时需要将<code>import service</code>改为<code>import sec</code>，如下图所示<br />
<img src="http://lucumt.info/blog_img/import-local-page-in-intellij-idea/goclipse_package_reference_folder.png" alt="goclipse中的本地包通过文件夹引用" />
<br />
可以看出在eclipse中导入<code>Golang</code>本地包时有两种方法： <strong>通过import导入包名</strong> 或 <strong>通过import导入该包对应的文件夹</strong> ，这两种方法均可使程序正常运行。</p>

<h2 id="在intellij-idea中引用golang本地包:bb4f21717a930ee21245b90e8acfc2d5">在Intellij IDEA中引用Golang本地包</h2>

<p>下面2张图为在IDEA中建立的对应项目，图中 <em>gproject</em> 是一个项目，<em>gotest</em> 是一个模块，我们在 <em>gotest</em> 下建立相关的测试文件。<br />
<img src="http://lucumt.info/blog_img/import-local-page-in-intellij-idea/idea_package.png" alt="IDEA中的本地包" />
<br />
<img src="http://lucumt.info/blog_img/import-local-page-in-intellij-idea/idea_package_reference.png" alt="IDEA中的本地包引用" />
<br />
在上述代码中我们是通过<code>import service</code>的方式来导入相应包的，由于IDEA对Golang很强，从图中可以看出 <em>service</em> 的颜色与其它导入包的颜色不一致，当把鼠标移动到 <em>service</em> 上时会提示 <em>Cannot resolve file &lsquo;service&rsquo;</em> ，直接运行时，会出现如下图所示 <em>cannot find package</em> 错误，将<code>import service</code>修改为<code>import sec</code>时，会出现同样的错误，可以看出在idea中默认不支持直接导入本地<code>Golang</code>包。<br />
<img src="http://lucumt.info/blog_img/import-local-page-in-intellij-idea/idea_package_reference_run_error.png" alt="IDEA中引用本地包运行出错" />
<br />
从报错信息可以看出，程序在运行时先去 <strong>GOROOT</strong> 去搜索导入包，然后去 <strong>GOPATH</strong> 寻找导入包，最后在当前项目模块下寻找导入包，但实际上不存在 <em>D:\program\IntelliJ IDEA 2016.2.1\workspace\gproject\gotest\src\service</em> 这个目录，故而程序报错，不能正常运行。</p>

<p>解决该问题的关键是明白 <strong><a href="http://golang.org/doc/install#tarball_non_standard">GOROOT</a></strong> 和 <strong><a href="http://golang.org/cmd/go/#hdr-GOPATH_environment_variable">GOPATH</a></strong> 的作用，根据官方文档的解释 <strong>GOPATH</strong> 的主要作用是存放文件以便<code>Golang</code>程序编译时可以进行搜索引用，<strong>GOPATH</strong> 可以设置一个值或多个值，多个值之间以分号隔开。很明显只要我们将本地<code>Golang</code>加入到 <strong>GOPATH</strong>中即可在IDEA中正常运行该程序。</p>

<p>如下图所示，在IDEA中依次选择 <strong>File-&gt;Settings-&gt;Language&amp;Frameworks-&gt;Go-&gt;Go Libraries</strong> ，会出现如下图所示的配置<code>Golang</code>库的界面，在该界面可以添加<code>Golang</code>本地包所在的路径，该界面包含3个不同作用范围的配置方式： <em>Global libraries</em> 、 <em>Project libraries</em> 和 <em>Module libraries</em> ，其中 <em>Global libraries</em> 的配置对所有项目生效为全局配置，<em>Project libraries</em> 的配置对整个项目生效，<em>Module libraries</em> 的配置只对模块生效，可以看出在 <em>Global libraries</em> 默认包含了 <strong>GOPATH</strong> 。根据实际使用的需求我们可以选择把本地包设置在 <em>Project libraries</em> 还是 <em>Module libraries</em> 中。<br />
<img src="http://lucumt.info/blog_img/import-local-page-in-intellij-idea/idea_package_select_gopath.png" alt="IDEA中配置程序库" />
<br />
本文的程序都是在 <em>gotest</em> 模块下，故将其添加到 <em>Module libraries</em> 下，添加完的结果如下所示：<br />
<img src="http://lucumt.info/blog_img/import-local-page-in-intellij-idea/idea_package_gopath_config.png" alt="IDEA中配置程序库的结果" />
<br />
将本地包添加到模块库之后，还需要在go文件中将导入包的语句设置为<code>import sec</code>，不能设置为<code>import service</code>，然后该<code>Golang</code>程序即可正常运行。</p>

<p>可以看出，不同于<a href="https://goclipse.github.io/">goclipse</a>，在IDEA中只能使用 <strong>通过import导入该包对应的文件夹</strong> 来导入本地<code>Golang</code>包，至于原因还需要进一步研究。</p>

<h2 id="利用goclipse时无法运行程序的解决方法:bb4f21717a930ee21245b90e8acfc2d5">利用Goclipse时无法运行程序的解决方法</h2>

<p>在使用<a href="https://goclipse.github.io/">goclipse</a>运行<code>Golang</code>程序时，偶尔会出现程序无法编译和运行的情况，这种情形一般都是 <em>src</em> 没有被设置成源代码目录造成的，此时可以通过如下图所示的方法，将 <em>src</em> 目录添加源代码目录。在Eclipse中选中该项目然后点击 <strong>Properties</strong> ，会出现项目属性配置界面，点击 <strong>Go Project Configuration</strong> ，通过 <strong>Add Folder</strong> 可以将 <em>src</em> 添加到源代码中，之后程序即可正常运行。<br />
<img src="http://lucumt.info/blog_img/import-local-page-in-intellij-idea/goclipse_add_source_folder.png" alt="goclipse中添加源程序目录" />
</p>

	
			

			

			
          </section>
		  
		  <div class="page-link">
			
			<a href="http://lucumt.info/posts/calculate-total-area-of-two-rectangles/">//下一篇</a>
			
			&nbsp;
			
			<a class="page-link-right" href="http://lucumt.info/posts/java-concurrency/java-concurrency-multithreading-tutorial/">//上一篇</a>
			
	      </div>

          
          	<div id="disqus_thread"></div>
<script type="text/javascript">
    var disqus_shortname = 'rosenlu';
    var disqus_identifier = 'http:\/\/lucumt.info\/posts\/import-local-package-in-intellij-idea\/';
    var disqus_title = '在Intellij IDEA中引用Golang本地包';
    var disqus_url = 'http:\/\/lucumt.info\/posts\/import-local-package-in-intellij-idea\/';

    (function() {
        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
        dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
    })();
</script>
<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
<a href="http://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>
          
        
      <div class="footer">
	<hr class="thin" />
	<div class="pure-menu pure-menu-horizontal pure-menu-open">
		<ul class="footer-menu">
		
			<li><a href="https://github.com/tmaiaroto/hugo-redlounge">Designed by Red Lounge</a></li>
		
		</ul>
	</div>

	<p>&copy; 2017. All rights reserved.</p>
</div>
    </div>
  </div>
	
		<script type="text/javascript">
			onscroll = function() {
			  var toTopVisible = false;
			  var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
			  if (scrollTop > 1000) {
			    if (!toTopVisible) {
			      document.getElementById('nav-to-top').style.display = 'block';
			    }
			  } else {
			    if (scrollTop < 1000 || toTopVisible) {
			      document.getElementById('nav-to-top').style.display = 'none';
			    }
			  }
			};
		</script>
	

	

  
</body>
</html>